//Roman numerals are represented by seven different symbols: I, V, X, L, C, D an
//d M. 
//
// 
//Symbol       Value
//I             1
//V             5
//X             10
//L             50
//C             100
//D             500
//M             1000 
//
// For example, 2 is written as II in Roman numeral, just two one's added togeth
//er. 12 is written as XII, which is simply X + II. The number 27 is written as XX
//VII, which is XX + V + II. 
//
// Roman numerals are usually written largest to smallest from left to right. Ho
//wever, the numeral for four is not IIII. Instead, the number four is written as 
//IV. Because the one is before the five we subtract it making four. The same prin
//ciple applies to the number nine, which is written as IX. There are six instance
//s where subtraction is used: 
//
// 
// I can be placed before V (5) and X (10) to make 4 and 9. 
// X can be placed before L (50) and C (100) to make 40 and 90. 
// C can be placed before D (500) and M (1000) to make 400 and 900. 
// 
//
// Given a roman numeral, convert it to an integer. 
//
// 
// Example 1: 
//
// 
//Input: s = "III"
//Output: 3
// 
//
// Example 2: 
//
// 
//Input: s = "IV"
//Output: 4
// 
//
// Example 3: 
//
// 
//Input: s = "IX"
//Output: 9
// 
//
// Example 4: 
//
// 
//Input: s = "LVIII"
//Output: 58
//Explanation: L = 50, V= 5, III = 3.
// 
//
// Example 5: 
//
// 
//Input: s = "MCMXCIV"
//Output: 1994
//Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
// 
//
// 
// Constraints: 
//
// 
// 1 <= s.length <= 15 
// s contains only the characters ('I', 'V', 'X', 'L', 'C', 'D', 'M'). 
// It is guaranteed that s is a valid roman numeral in the range [1, 3999]. 
// Related Topics 数学 字符串 
// 👍 1306 👎 0


package leetcode.editor.cn;


//Java：Roman to Integer
class P13RomanToInteger {
    public static void main(String[] args) {
        Solution solution = new P13RomanToInteger().new Solution();
        // TO TEST
        System.out.println(solution.romanToInt("III"));
    }

    //leetcode submit region begin(Prohibit modification and deletion)
    class Solution {
        public int romanToInt(String s) {

            //I             1
//V             5
//X             10
//L             50
//C             100
//D             500
//M             1000
            String romArr = "IVXLCDM";

            //Input: s = "MCMXCIV"
//Output: 1994
//Explanation: M = 1000, CM = 900, XC = 90 and IV = 4.
            int[] romNum = new int[]{1, 5, 10, 50, 100, 500, 1000};
            int sum = 0;
            if (s == null || s.length() == 0) {
                return 0;
            }
            int i;
            for (i = 0; i < s.length() - 1; i++) {
                char cur = s.charAt(i);
                char next = s.charAt(i + 1);
                int curIndex = romArr.indexOf(cur);
                int nextIndex = romArr.indexOf(next);
                if (curIndex < nextIndex) {
                    sum += romNum[nextIndex] - romNum[curIndex];
                    //增一位
                    i += 1;
                    continue;
                } else {
                    sum += romNum[curIndex];
                }
            }
            return i == s.length() - 1 ? sum + romNum[romArr.indexOf(s.charAt(s.length() - 1))] : sum;
        }
        public   int romanToIntOld(String s) {

            /**
             * I             1
             * V             5
             * X             10
             * L             50
             * C             100
             * D             500
             * M             1000
             */
            /**
             * I can be placed before V (5) and X (10) to make 4 and 9.
             * X can be placed before L (50) and C (100) to make 40 and 90.
             * C can be placed before D (500) and M (1000) to make 400 and 900.
             */

            int sum = 0;
            for (int i = 0; i < s.length(); i++) {
                switch (s.charAt(i)){
                    case 'I':
                        if (i + 1 < s.length()) {
                            if (s.charAt(i + 1) == 'V') {
                                i++;
                                sum +=5-1;
                                break;
                            } else if (s.charAt(i + 1) == 'X') {
                                i++;
                                sum +=10-1;
                                break;
                            }

                        }
                        sum +=1;
                        break;
                    case 'V':
                        sum +=5;
                        break;
                    case 'X':
                        if (i + 1 < s.length()) {
                            if (s.charAt(i + 1) == 'L') {
                                i++;
                                sum +=50-10;
                                break;
                            } else if (s.charAt(i + 1) == 'C') {
                                i++;
                                sum +=100-10;
                                break;
                            }

                        }
                        sum +=10;
                        break;
                    case 'L':
                        sum += 50;
                        break;
                    case 'C':
                        if (i + 1 < s.length()) {
                            if (s.charAt(i + 1) == 'D') {
                                i++;
                                sum +=500-100;
                                break;
                            } else if (s.charAt(i + 1) == 'M') {
                                i++;
                                sum +=1000-100;
                                break;
                            }

                        }
                        sum +=100;
                        break;
                    case 'D':
                        sum += 500;
                        break;
                    case 'M':
                        sum += 1000;
                        break;
                }

            }
            return sum;


        }

    }
//leetcode submit region end(Prohibit modification and deletion)

}